
/*
Gerado por nDeveloper Framework Versão 1.4.3 (0)
*/
using System;
using System.Collections;
using System.Text;
using System.Data;
using nDeveloper.BO.Base.Domain;
using ExemploWinAppCS.BO.Info;

namespace ExemploWinAppCS.BO.DataAccess
{
	/// <summary>
	/// Classe base de acesso aos dados da entidade tblCliente. Entidade para manutenção dos clientes.
	/// </summary>
	[Serializable]
	public abstract class _ClienteDA : BaseDb
	{
		#region Declarações

		protected tblCliente _cliente;
		protected int _idUltimoInserido;
		private bool _novo;

		#endregion

		#region Propriedades

		public tblCliente Cliente
		{
			get
			{
				return _cliente;
			}
			set
			{
				_cliente = value;
			}
		}

		public bool Novo
		{
			get
			{
				return _novo;
			}
			set
			{
				_novo = value;
			}
		}
		#endregion

		#region Funções e métodos

		/// <summary>
		/// Retorna uma lista de todos os registros.
		/// </summary>
		/// <returns>DataTable</returns>
		public DataTable ListaCliente()
		{
			DataTable dt = new DataTable();
			dt.TableName = "tblCliente";
			dt.RemotingFormat = SerializationFormat.Binary;
			dt.Load(con.ExecuteReader("SELECT * FROM tblCliente"));
			return dt;
		}

		/// <summary>
		/// Retorna uma lista de todos os registros de acordo com o que foi definidio como visível no nDev IDE.
		/// </summary>
		/// <returns>DataTable</returns>
		public DataTable ListaRicaCliente()
		{
			DataTable dt = con.ExecuteRichDataTable("SELECT ClienteID, Nome, Email, CPF FROM tblCliente");
			dt.TableName = "tblCliente";
			dt.RemotingFormat = SerializationFormat.Binary;
			return dt;
		}

		/// <summary>
		/// Retorna uma lista com os últimos registros inseridos.
		/// </summary>
		/// <param name="Quantidade">Quantidade de registros desejada.</param>
		/// <returns>DataTable</returns>
		public DataTable ListaUltimosInseridos(int Quantidade)
		{
			DataTable dt = new DataTable();
			dt.TableName = "ListLasttblCliente";
			dt.RemotingFormat = SerializationFormat.Binary;
			dt.Load(con.ExecuteReader("SELECT TOP " + Quantidade.ToString() + " * FROM tblCliente ORDER BY ClienteID DESC"));
			return dt;
		}

		/// <summary>
		/// Retorna o ID do último registro inserido.
		/// </summary>
		/// <returns></returns>
		public int IdUltimoInserido()
		{
			return _idUltimoInserido;
		}

		/// <summary>
		/// Retorna a quantidade de registros salvos na entidade.
		/// </summary>
		/// <returns></returns>
		public int QuantidadeRegistros()
		{
			object o = con.ExecuteScalar("SELECT COUNT(tblCliente.ClienteID) AS Total FROM tblCliente");
			if (o == null)
			{
				return 0;
			}
			else
			{
				return Convert.ToInt32(o);
			}
		}

		/// <summary>
		/// Verifica se um determinado registro existe.
		/// </summary>
		/// <param name="ClienteID">Código</param>
		/// <returns></returns>
		public bool ExisteCliente(int ClienteID)
		{
			con.AddParameter("@ClienteID", ClienteID);
			object o = con.ExecuteScalar("SELECT COUNT(tblCliente.ClienteID) AS Total FROM tblCliente WHERE ClienteID = @ClienteID");
			if (o == null)
			{
			    return false;
			}
			else
			{
			    return Convert.ToInt32(o) > 0;
			}
		}

		/// <summary>
		/// Exclui o registro.
		/// </summary>
		public void Excluir()
		{
			try
			{
				con.BeginTransaction();

				con.AddParameter("@ClienteID", _cliente.ClienteID);
				con.ExecuteNonQuery("DELETE FROM tblCliente WHERE (ClienteID = @ClienteID)", nDeveloper.Data.ConnectionState.KeepOpen);
				_cliente.ClienteID = -1;

				con.CommitTransaction();
			}
			catch (Exception e)
			{
				con.RollbackTransaction();
				throw new Exception("Erro ao excluir o registro: " + e.Message);
			}
		}

		private int Inserir()
		{
			try
			{
				con.BeginTransaction();

				con.AddParameter("@Nome", _cliente.Nome, false);
				con.AddParameter("@Email", _cliente.Email, true);
				con.AddParameter("@CPF", _cliente.CPF, true);

				StringBuilder strSQL = new StringBuilder();
				strSQL.Append("INSERT INTO tblCliente");
				strSQL.Append(" (");
				strSQL.Append("Nome, ");
				strSQL.Append("Email, ");
				strSQL.Append("CPF");
				strSQL.Append(") ");
				strSQL.Append("VALUES ");
				strSQL.Append("(");
				strSQL.Append("@Nome, ");
				strSQL.Append("@Email, ");
				strSQL.Append("@CPF");
				strSQL.Append(");");

				if (DataBaseConfig.GetServerType() == nDeveloper.BO.Base.Constants.vsDataBase.SQLServerEverywhere || DataBaseConfig.GetServerType() == nDeveloper.BO.Base.Constants.vsDataBase.Firebird)
				{
					con.ExecuteNonQuery(strSQL.ToString(), nDeveloper.Data.ConnectionState.KeepOpen);
					con.CommitTransaction();

					object o = con.ExecuteScalar("SELECT MAX(tblCliente.ClienteID) AS UltimoInserido FROM tblCliente");

					if (o == null)
					{
						_idUltimoInserido = 0;
					}
					else
					{
						_idUltimoInserido = Convert.ToInt32(o);
					}
				}
				else
				{
					strSQL.Append(" Select @@Identity");
					_idUltimoInserido = Convert.ToInt32(con.ExecuteScalar(strSQL.ToString(), nDeveloper.Data.ConnectionState.KeepOpen));
					con.CommitTransaction();
				}
			}
			catch (Exception e)
			{
				con.RollbackTransaction();
				throw new Exception("Erro ao inserir o registro: " + e.Message);
			}
			return _idUltimoInserido;
		}

		private int Atualizar()
		{
			try
			{
				con.BeginTransaction();

				con.AddParameter("@Nome", _cliente.Nome, false);
				con.AddParameter("@Email", _cliente.Email, true);
				con.AddParameter("@CPF", _cliente.CPF, true);

				StringBuilder strSQL = new StringBuilder();
				strSQL.Append("UPDATE tblCliente SET ");
				strSQL.Append("Nome = @Nome, ");
				strSQL.Append("Email = @Email, ");
				strSQL.Append("CPF = @CPF");
				strSQL.Append(" WHERE ");
				strSQL.Append("ClienteID = " + _cliente.ClienteID);

				con.ExecuteNonQuery(strSQL.ToString(), nDeveloper.Data.ConnectionState.KeepOpen);

				con.CommitTransaction();
			}
			catch (Exception e)
			{
				con.RollbackTransaction();
				throw new Exception("Erro ao atualizar o registro: " + e.Message);
			}
			return _cliente.ClienteID;
		}

		/// <summary>
		/// Grava o objeto no banco de dados (salva ou atualiza).
		/// </summary>
		public int Gravar()
		{
			if (this._novo)
			{
				return Inserir();
			}
			else
			{
				return Atualizar();
			}
		}

		/// <summary>
		/// Retorna uma instância do objeto.
		/// </summary>
		/// <param name="ClienteID">Código</param>
		/// <returns>tblCliente</returns>
		public tblCliente RetornaCliente(int ClienteID)
		{
			con.AddParameter("@ClienteID", ClienteID);

			DataTable dt = new DataTable();
			dt.Load(con.ExecuteReader("SELECT * FROM tblCliente WHERE (ClienteID = @ClienteID)"));

			return RetornaCamposCliente(dt);
		}

		/// <summary>
		/// Retorna uma instância do objeto com todos os campos preenchidos pelo datatable.
		/// </summary>
		/// <param name="dt">Informação do campo e registro da entidade.</param>
		/// <returns>tblCliente</returns>
		protected tblCliente RetornaCamposCliente(DataTable dt)
		{
			if (dt.Rows.Count > 0)
			{
				tblCliente objeto = new tblCliente();
				if (dt.Rows[0]["ClienteID"] != DBNull.Value)
				{
					objeto.ClienteID = (int) dt.Rows[0]["ClienteID"];
				}
				else
				{
					objeto.ClienteID = 0;
				}
				if (dt.Rows[0]["Nome"] != DBNull.Value)
				{
					objeto.Nome = (string) dt.Rows[0]["Nome"];
				}
				else
				{
					objeto.Nome = "";
				}
				if (dt.Rows[0]["Email"] != DBNull.Value)
				{
					objeto.Email = (string) dt.Rows[0]["Email"];
				}
				else
				{
					objeto.Email = "";
				}
				if (dt.Rows[0]["CPF"] != DBNull.Value)
				{
					objeto.CPF = (string) dt.Rows[0]["CPF"];
				}
				else
				{
					objeto.CPF = "";
				}
				return objeto;
			}
			else
			{
				 return null;
			}
		}
		#endregion
	}
}